package br.com.locanet.service.impl;

import java.util.List;

import javax.persistence.PersistenceException;

import br.com.locanet.bean.impl.CopiaFilme;
import br.com.locanet.dao.database.impl.CopiaFilmeDAO;
import br.com.locanet.exception.ExceptionList;
import br.com.locanet.exception.InvalidAttributeException;
import br.com.locanet.service.AbstractEntityService;

public class CopiaFilmeService extends
		AbstractEntityService<CopiaFilme, CopiaFilmeDAO> {
	@Override
	public void doValidateRequiredFields(CopiaFilme entity) throws ExceptionList,PersistenceException {
		ExceptionList fieldsInvalidos = new ExceptionList();

		if (entity.getCodigo() == null)
			fieldsInvalidos.add(new InvalidAttributeException(
					"codigoNaoInformado"));	    
		if (entity.getFilme() == null || entity.getFilme().getId() ==null)
			fieldsInvalidos.add(new InvalidAttributeException(
					"filmeNaoInformado"));
		if (entity.getStatus() == null)
			fieldsInvalidos.add(new InvalidAttributeException(
					"statusNaoInformado"));
		
		if (!fieldsInvalidos.getListaErros().isEmpty())
			throw fieldsInvalidos;
	}

	@Override
	public void doValidateBusinessRules(CopiaFilme entity) throws ExceptionList,PersistenceException,ClassNotFoundException{
		ExceptionList excecoes = new ExceptionList();
		
		CopiaFilme copiaFilme = new CopiaFilme();
		
		copiaFilme.setCodigo(entity.getCodigo());
		List<CopiaFilme> copias = getDAO().find(copiaFilme);
		for (CopiaFilme copia : copias)
			if (copia.getCodigo().equals(copiaFilme.getCodigo()) && !copia.getId().equals(entity.getId())){
				excecoes.add(new InvalidAttributeException("codigoJaCadastrado"));
				break;
			}
		
		if (!excecoes.getListaErros().isEmpty())
			throw excecoes;
	}
	@Override
	public CopiaFilme doMerge(CopiaFilme entity) throws PersistenceException {
		CopiaFilme oldEntity = selectById(entity);
			
		if (entity.getFilme()!=null&&entity.getFilme().getId()!=null)
			oldEntity.setFilme(entity.getFilme());
		if (entity.getCodigo()!=null)
			oldEntity.setCodigo(entity.getCodigo());
		if (entity.getStatus()!=null)
			oldEntity.setStatus(entity.getStatus());
		
		return oldEntity;
	}
	
	@Override
	public void delete(CopiaFilme entity) throws PersistenceException {
		try {
			doExclusaoLogica(entity);
		} catch (Exception e) {
			throw new PersistenceException(e);
		}
	}
	
	private void doExclusaoLogica(CopiaFilme copia)throws Exception{
		copia=selectById(copia);
		copia.setStatus(copia.getStatus()==1?0:copia.getStatus()==0?1:2);
		update(copia);
	}
}
